﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using EventPlanner.Models;



namespace EventPlanner.Controllers
{
    /* Controlador de contactos */
    [Authorize]
    public class ContactoController : Controller
    {
        IDbContext db;
        
        /*Constructor sin parámetros: crea una instancia de la clase a partir de la base de datos real de EventPlanner */
        public ContactoController()
        {
            db = new EventPlannerDB();            
        }

        /*Constructor con un parámetro: crea una instancia de la clase a partir de una base de datos simulada como parámetro */         
        public ContactoController(IDbContext fake_db)
        {
            db = fake_db;
        }


        /*GET - Muestra la lista de contactos del usuario actualmete logueado */
        public ActionResult Index()
        {
            var usuario = UsuarioActual();            

            if (usuario == null)
            {
                Elmah.ErrorSignal.FromCurrentContext().Raise(new System.NullReferenceException("El valor usuario no puede ser nulo"));
                return (RedirectToAction("ErrorAmigable", "Excepcion", new { NumError = 1 }));
            }

            var model = usuario.Contactos;            
            return View(model);  
        }
        
        
        /*GET - Crea un nuevo contacto */
        public ActionResult Create()
        {            
            return View();
        } 

        
        /*POST - Crea un nuevo contacto */
        [HttpPost]
        public ActionResult Create(Contacto NuevoContacto)
        {
            db.Add<Contacto>(NuevoContacto);
            var usuario = UsuarioActual();

            if (usuario == null){
                Elmah.ErrorSignal.FromCurrentContext().Raise(new System.NullReferenceException("El valor usuario no puede ser nulo"));
                return (RedirectToAction("ErrorAmigable", "Excepcion", new { NumError = 1 }));
            }

            try
            {                
                usuario.Contactos.Add(NuevoContacto);
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            catch (System.Exception e)
            {
                Elmah.ErrorSignal.FromCurrentContext().Raise(e);
                return (RedirectToAction("ErrorAmigable", "Excepcion", new { NumError = 5 }));                
            }
        }
        
        

        /*GET - Edita un contacto recibido como parametro de entrada */
        public ActionResult Edit(int id)
        {
            Contacto contacto = db.Find<Contacto>(id);

            if (contacto == null)
            {
                Elmah.ErrorSignal.FromCurrentContext().Raise(new System.NullReferenceException("El contacto no puede ser nulo"));
                return (RedirectToAction("ErrorAmigable", "Excepcion", new { NumError = 2 }));
            }

            return View(contacto);            
        }


        /*POST - Edita un contacto recibido como parametro de entrada */
        [HttpPost]
        public ActionResult Edit(int id, FormCollection collection)
        {
            var contacto = db.Find<Contacto>(id);
            if (contacto == null)
            {
                Elmah.ErrorSignal.FromCurrentContext().Raise(new System.NullReferenceException("El contacto no puede ser nulo"));
                return (RedirectToAction("ErrorAmigable", "Excepcion", new { NumError = 2 }));
            }
            
            if (TryUpdateModel(contacto))            
            {
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            else
            {
                return (RedirectToAction("ErrorAmigable", "Excepcion", new { NumError = 5 }));
            }
            
        }

        /*GET - Elimina un contacto recibido como parametro de entrada*/
        public ActionResult Delete(int id)
        {
            Contacto contacto = db.Find<Contacto>(id);

            if (contacto == null)
            {
                Elmah.ErrorSignal.FromCurrentContext().Raise(new System.NullReferenceException("El contacto no puede ser nulo"));                
                return (RedirectToAction("ErrorAmigable", "Excepcion", new { NumError = 2 }));                
            }

            return View(contacto);            
        }


        /*POST - Elimina un contacto recibido como parametro de entrada*/
        [HttpPost]
        public ActionResult Delete(int id, FormCollection collection)
        {            
            try
            {
                db.Delete<Contacto>(db.Find<Contacto>(id));                
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            catch (System.ArgumentNullException e)
            {
                Elmah.ErrorSignal.FromCurrentContext().Raise(e);
                return (RedirectToAction("ErrorAmigable", "Excepcion", new { NumError = 2 }));                
            }
        }

        
        /* Devuelve el usuario actualmete logueado */
        private Usuario UsuarioActual()
        {
            string user = db.GetActualUser();
            var Usuarios = from u in db.Usuarios
                           where u.WebSiteUser == user
                           select u;
            Usuario usuario;
            try
            {
                usuario = Usuarios.Single();                
            }
            catch (System.InvalidOperationException)
            {
                return (null);
            }
            return (usuario);
        }




    }
}
